﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sisco.LogicaNegocio
{
    public class ProblemaBLL
    {
        public List<AccesoDatos.PROBLEMA> Listar()
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();

            return problemaDAO.Listar();
        }
        
        public int Registrar(AccesoDatos.PROBLEMA nuevoProblema)
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();

            return problemaDAO.Registrar(nuevoProblema);
        }

        public void RegistrarSolucion(AccesoDatos.PROBLEMA problema, string solucion, string usuarioRegistroSolucion)
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();
            problemaDAO.RegistrarSolucion(problema, solucion, usuarioRegistroSolucion);
        }

        public void RegistrarRechazo(AccesoDatos.PROBLEMA problema, string rechazo, string nombreusuariosistema)
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();
            problemaDAO.RegistrarRechazo(problema, rechazo, nombreusuariosistema);
        }

        public List<AccesoDatos.PROBLEMA> ListarProblemaTipo(AccesoDatos.PROBLEMA_TIPO tipoProblema)
        {
            List<AccesoDatos.PROBLEMA> lista = this.Listar();

            return lista.Where(x => x.PROBLEMA_TIPO.TIPO_PROBLEMA == tipoProblema.TIPO_PROBLEMA).ToList();
        }

        public List<AccesoDatos.PROBLEMA> ListarProblemaHardwareReparador(AccesoDatos.USUARIO selectedReparador)
        {
            List<AccesoDatos.PROBLEMA> lista = this.ListarProblemaTipo(new AccesoDatos.PROBLEMA_TIPO() { TIPO_PROBLEMA = "hardware" });

            return lista.Where(x => (x.IDREPARADOR.HasValue ? x.IDREPARADOR : 0) == selectedReparador.ID).ToList();
        }

        public List<AccesoDatos.PROBLEMA> ListarProblemaSoftwareReparador(AccesoDatos.USUARIO selectedReparador)
        {
            List<AccesoDatos.PROBLEMA> lista = this.ListarProblemaTipo(new AccesoDatos.PROBLEMA_TIPO() { TIPO_PROBLEMA = "software" });

            return lista.Where(x => (x.IDREPARADOR.HasValue ? x.IDREPARADOR : 0) == selectedReparador.ID).ToList();   
        }

        public DataTable Rep_ListarProblema(int? idUsuario, int? idDpto, int? idSucursal, int? idCaso, int? idReparador, int? idTipoProblema, DateTime? fechaRegistroDesde, DateTime? fechaRegistroHasta, string estado)
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();
            return problemaDAO.USP_ListarProblema(idUsuario, idDpto, idSucursal, idCaso, idReparador, idTipoProblema, fechaRegistroDesde, fechaRegistroHasta, estado);
        }

        public DataTable ListarProblema(int? idAsistenteReparador, string estado, DateTime? fechaRegistroDesde, DateTime? fechaRegistroHasta)
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();
            return problemaDAO.USP_ListarProblema(idAsistenteReparador, estado, fechaRegistroDesde, fechaRegistroHasta);
        }

        public AccesoDatos.PROBLEMA GetProblema(int IdProblema)
        {
            List<AccesoDatos.PROBLEMA> lista = this.Listar();
            return lista.SingleOrDefault(x => x.ID == IdProblema);
        }

        public int Modificar(AccesoDatos.PROBLEMA selectedProblema, AccesoDatos.PROBLEMA updProblema, AccesoDatos.USUARIO usuarioSistema)
        {
            AccesoDatos.ProblemaDAO problemaDAO = new AccesoDatos.ProblemaDAO();
            return problemaDAO.Modificar(selectedProblema, updProblema, usuarioSistema);
        }
    }
}
